package org.asiainfo.system.service;

import org.asiainfo.common.mybatis.stream.core.page.TableDataInfo;
import org.asiainfo.common.mybatis.stream.core.page.PageQuery;

import java.util.Collection;
import java.util.List;

import org.asiainfo.system.domain.vo.SysTenantVo;
import org.asiainfo.system.domain.bo.SysTenantBo;
import org.asiainfo.system.domain.SysTenant;
import com.mybatisflex.core.service.IService;

/**
 * 租户表Service接口
 *
 * @author dotor-ww
 */
public interface SysTenantService extends IService<SysTenant> {

    /**
     * 通过id查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    SysTenantVo queryById(Long id);

    /**
     * 查询
     *
     * @param sysTenantBo 筛选条件
     * @return 查询结果
     */
    List<SysTenantVo> queryList(SysTenantBo sysTenantBo);

    /**
     * 分页查询
     *
     * @param sysTenantBo 筛选条件
     * @param pageQuery   分页对象
     * @return 查询结果
     */
    TableDataInfo<SysTenantVo> queryPageList(SysTenantBo sysTenantBo, PageQuery pageQuery);

    /**
     * 新增数据
     *
     * @param sysTenantBo 实例对象
     * @return 实例对象
     */
    Boolean insertByBo(SysTenantBo sysTenantBo);

    /**
     * 修改数据
     *
     * @param sysTenantBo 实例对象
     */
    Boolean updateByBo(SysTenantBo sysTenantBo);

    /**
     * 通过主键删除数据
     *
     * @param ids 主键
     */
    Boolean deleteWithValidByIds(Collection<Long> ids);

    /**
     * 基于租户ID查询租户信息
     *
     * @param tenantId 租户ID
     * @return 租户信息
     */
    SysTenantVo queryByTenantId(Long tenantId);

    /**
     * 校验租户是否能操作
     *
     * @param tenantId 租户ID
     */
    void checkTenantAllowed(Long tenantId);

    /**
     * 校验租户账号余额
     *
     * @param tenantId 租户ID
     * @return 校验结果
     */
    Boolean checkAccountBalance(Long tenantId);

    /**
     * 校验有效期
     *
     * @param tenantId 租户ID
     * @return 校验结果
     */
    Boolean checkExpireTime(Long tenantId);

    /**
     * 校验公司名称是否唯一
     *
     * @param sysTenantBo 租户信息
     * @return 校验结果
     */
    Boolean checkCompanyNameUnique(SysTenantBo sysTenantBo);

    /**
     * 修改租户状态
     *
     * @param sysTenantBo 租户信息
     * @return 修改结果
     */
    Boolean updateTenantStatus(SysTenantBo sysTenantBo);

    /**
     * 同步套餐
     *
     * @param tenantId  租户ID
     * @param packageId 套餐ID
     * @return 同步结果
     */
    Boolean syncTenantPackage(Long tenantId, Long packageId);

    /**
     * 动态切换租户
     *
     * @param tenantId 租户ID
     */
    void dynamicTenant(Long tenantId);
}
